package org.fjsei.yewu.index;

import graphql.schema.DataFetchingEnvironment;
import lombok.Data;
import lombok.NoArgsConstructor;
import md.cm.unit.Unit;
import md.specialEqp.*;
import md.specialEqp.inspect.Detail;
import md.specialEqp.type.Pipeline;
import md.specialEqp.type.PipingUnitCommon;
import org.fjsei.yewu.filter.Node;
import org.fjsei.yewu.filter.Uunode;
import org.fjsei.yewu.util.Tool;
import org.springframework.data.elasticsearch.annotations.Document;

import java.time.LocalDate;
import java.util.List;
import java.util.UUID;


/** 目前本ES索引还未被使用！！ 类似的getAllEqpEsFilter()??， 只有hibernate-search 、HS做索引存储保存（后台人工 批处理作业处理）。
 * 前端页面 独立 /pipeunits/  ,/pipeunits/pipeunit_id/
 * 【用处是】管道单元PipingUnit搜索索引的：spring-data-elasticsearch工具提供的--只读搜索模型。
 * 实际后端graphQL对于PipingUnitCommon没有规定具体的字段？ 多种模型都能通用的查询connection[]<></>列表？
 * */
@Document(indexName="pipingunit-read", createIndex=false)
@Data
@NoArgsConstructor
public class PipingUnitEs implements PipingUnitCommon, Uunode {
    protected UUID id;

    private String  code;
    private String  code_sort;

    //这里主要都是需要 过滤的字段， 不需要过滤字段假设在前端轮播概要版本ListItem列表所需要展示的那些关键定位识别字段的也需要放在这里：避免二次查询走关系数据库。
    //并非搜索的必须定位； Eqp:{id,?cod,?rno}
    /**本模型spring-data-elasticsearch配套的，hibernate-Search注解是在Entity类内部顺带的；前者缩小为查询用途，后者是更新数据重建ES用途，后者的查询API实际会结合ES和JPA俩个合并结果似乎多此一举，所以查询没有走后者模式的。
     * 这儿虽然直接申明Pipeline数据类型，但实际上可以访问嵌套对象字段也需要依据实际的ES存储信心来定夺的。从ES库查的获知：
     * 目前这个模型实际可用有的是{id, useu{id, company{name}, person{name}}} 查询过滤仅能针对这些字段查ES库。
     * */
    private Pipeline pipe;

    /*从多对一 修改成 多对多之后，ES索引定义似乎没有太大修改; 自定义@PropertyBinding(binder = @PropertyBinderRef(type = NodeIdBinder.class))不能照搬：输入是List<>输出似乎一致?
     "det": {
          "dynamic": "strict",
          "properties": {
            "id": {
              "type": "keyword"
            }
          }
        },
     "dets": {
          "dynamic": "strict",
          "properties": {
            "id": {
              "type": "keyword"
            }
          }
        },
    * */
    private  List<Detail> dets;       //Detail这里实际只有[ID!]可用字段 ? UunodeEs
    //private Detail  det;
    //替代 上传国家平台的 管道单元名称， =组合的关键字。
    private String  rno;
    private String  start;
    private String  stop;
    private UseState_Enum ust;
    private RegState_Enum reg;
    private String level;
    //保证能够和数据库同步？ ,下一步准备： 当作Detail 任务选择的过滤项；
    private LocalDate nxtd1;
    private LocalDate nxtd2;
    //虽然HS注解 @GenericField 默认"doc_values": false,但是可以读出来，不能被用于聚合、排序以及脚本操作！
    private LocalDate crDate;

    public String getId(DataFetchingEnvironment env) {
        return Tool.toGlobalId(this.getClass().getSimpleName(), this.id);
    }
}

